Web frontend での code 分割
前提として native application と同等の或いはより優れた體驗を Web application として實現しませう、と云ふ話が有る
PWA (progressive Web app)
分割に依って何が達成されるか
LCP (Largest Contentful Paint) を改善するのが目的
Web Vitals
Reduce JavaScript payloads with code splitting
古の技術。gateway server を立て、client へはその時々に必要な data 丈送ってゐた
HDML (Handheld Device Markup Language)、WML (Wireless Markup Language)
cHTML (Compact HTML)、XHTML/MP (XHTML Mobile Profile) の時代です
未だ bundling しない時代
Opera Mini
分割の單位。何を分割するか
route-based code splitting
頁單位
component-based code splitting
component單位
application-based code splitting
巨大な frontend application を microservice に見立てて
或いは WebWorker
critical assets を分ける
user が頁を開いた時に畫面內に見える範圍の主な內容を描畫する爲に必要な asset
critical assets 丈でも確實に cache に載せたい所
CSS
CSS in JS
styled component
CSS Module
rel="preload"
Preload critical assets to improve loading speed
Extract critical CSS
Defer non-critical CSS
だうやって分割するか
頑張って分割する
webpackwebpack.icon を使ふ
Code Splitting | webpack
Entry Points : Manually split code using entry configuration.
Prevent Duplication : Use the SplitChunksPlugin to dedupe and split chunks.
Dynamic Imports : Split code via inline function calls within modules.
CSS in JS
ReactReact.icon/ Next.jsNext.js.icon の場合
Code splitting with React.lazy and Suspense
コード分割 – React
素朴に書いておいて load に失敗すると頁全體が眞っ白に成るから error boundary で圍っとけよ、とかも書いてある
SSR (Server-Side Rendering) に 2020/9/15 では lazy と Suspence は使へない。替りに loadable-components を使ふ
gregberge/loadable-components: The recommended Code Splitting library for React ✂️✨
Server Side Rendering - Loadable Components
サスペンスを使ったデータ取得(実験的機能) – React
Code splitting with dynamic imports in Next.js
分割された ECMAScriptECMAScript.icon / CSS / HTML をだうやって讀み込むか
script 要素や link 要素を DOM に追加する
dynamic import
import - JavaScript | MDN
await import('〜.js');
CSS の@importは blocking なので end user 環境では使ふな
@importは事前 bundling するのに使ふ
preload / prefetch
Faster web navigation with predictive prefetching
ServiceWorker
PWA (progressive Web app) (Progressive Web App)
<link rel="preload"/>
HTTP/2 server push、HTTP/3 server push
分割した ECMAScriptECMAScript.icon、CSS を正しい順番で讀み込む
link や script を正しい順番で書く。正しい順番で書かないとそもそも bug りますよね
HTTP/2 priority、HTTP/3 priority
保證されるアレではないよ (確か)
讀み込む時に Web browser の動きを出來るだけ停めない
<script async>、<script defer>
<script>: スクリプト要素 - HTML: HyperText Markup Language | MDN
async 屬性っていつ使ふん…
prefetch する (前記)
Avoid chaining critical requests
クリティカル レンダリング パス  |  Web  |  Google Developers
Web browser のやり直しを減らす
クリティカル レンダリング パス  |  Web  |  Google Developers
大きく複雑なレイアウトとレイアウト スラッシングの回避  |  Web  |  Google Developers